// keyof
// keyof 获取对象类型的键的联合类型。
// JS当中获取key的语法： Object.keys()
// TS当中获取key的语法： keyof

interface Person {
  name: string;
  age: number;
  address: string;
}

type PersonKeys = keyof Person; // "name" | "age" | "address"

// 在泛型中使用
function getProperty<T, K extends keyof T>(obj: T, key: K): T[K] {
  return obj[key];
}

const person = {
  name: 'Alice',
  age: 30,
  address: '123 Main St'
};

const name2 = getProperty(person, 'name'); // 类型为 string
const age = getProperty(person, 'age'); // 类型为 number

console.log(name2, age);


// typeof 获取对象类型
// 在 TypeScript 中，typeof 关键字用于在类型系统中获取变量或属性的类型
// 类型推断，确保类型安全。
const Jack = {
  name: 'Jack',
  age: 18,
  address: '北京'
}
type JackType = typeof Jack
const Jack2:JackType = {
  name: 'Jack',
  age: 18,
  address: '北京'
}

// in 遍历枚举类型
type Days = {
  [k in PersonKeys]: any
}

const tom:Days = {
  name: 'Tom',
  age: 12,
  address: '广州'
}
